var Visualization = {};

var getPlusId = (function () {
    var id = 0;
    return function () {
        return ++id;
    }
})();

// 动画管理
Visualization.AnimationList = function () {};

// 动画
Visualization.Animation = function (time, delay, type) {};
Visualization.Animation.prototype = {
    constructor: Visualization.Animation,
}

// 观察者，代表管理scenes，主要与浏览器进行交互，并支持导出图片，视频等
Visualization.Viewer = function(canvas, option) {
    this.uid = getPlusId();
    this.canvas = canvas;
    this.option = option;
    this.scenes = [];
    this.data = {};
    this.animationList = new Visualization.AnimationList(); // 用于全局动画管理
}

Visualization.Viewer.prototype = {
    constructor: Visualization.Viewer,
    initialize: function (scene, data, option) {}, // 初始化，渲染首页
    changeScene: function (scene, data, option) {}, // 切换场景
    render: function () {
        for (var i = 0; i < this.scenes.length; i++) this.scenes[i].render();
    },
    exportSvg: function () {},
    exportJPG: function () {},
}

// 代表屏幕显示的内容，也可以播放声音，其它有关于当前显示任何的东西
Visualization.Scene = function(name, url, option) {
    this.uid = getPlusId();
    this.name = name;
    this.url = url;
    this.option = option;
    this.widgets = []; 
    this.animations = []; // 存放正在运行的动画，动画完毕后，自动移除，常用了场景切换
    this.parent = null;
}
Visualization.Scene.prototype = {
    constructor: Visualization.Scene,
    render: function () {
        this._render();
        for (var i = 0; i < this.widgets.length; i++) this.widgets[i].render();
    },
    // 渲染自己，比如背景图之类
    _render: function () {},
    playAudio: function () {}
};

// 表示要显示的单独元素，可以为组合元素，还包括交互.简单如柱状图，复杂的有n个图形合成的
Visualization.Widget = function (type, style) {
    this.uid = getPlusId();
    this.type = type; 
    this.style = style; // 代表渲染方式 
    this.parent = null;
    this.widgets = [];
    this.animations = []; // 存放正在运行的动画，动画完毕后，自动移除
    this.editors = []; // 添加编辑器，可以更改属性，添加可视化操作, 可以为特定元素的编辑器，也可以是附加的通用编辑器
};
Visualization.Widget.prototype = {
    constructor: Visualization.Widget,
    render: function () {
        this._render();
        for (var i = 0; i < this.widgets.length; i++) this.widgets[i].render();
    },
    // 渲染自己, 包括编辑模式
    _render: function () {},
    addEditor: function (editor) {},
    removeEditor: function (editor) {},
    addAnimation: function (animation) {}
};

// 添加到元素，可以开启元素编辑, option中包括可视化编辑，也包括表单式编辑. 
// 对于可视化，元素支持某个属性支持可视化，才可以进行可视化操作
Visualization.Editor = function (option) {
    this.uid = getPlusId();
    this.option = option;
    this.target = null;
};
Visualization.Editor.prototype = {
    constructor: Visualization.Editor,
    renderAttachElement: function () {},
}